﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TargetControl
{
    public partial class TargetView : UserControl
    {
        //Hệ quy chiếu
        private Projection objProjection;

        //Tỉ lệ kích thước giữa Target/View 
        public float RATE_TARGET_VIEW = 1.2F;

        //Bia bắn
        private Target objTarget;

        private DrawPolygon newPolygon;
        //Khoảng cách tối thiểu để vẽ đoạn nối giữa 2 điểm trong polygon
        //private const int minDistance = 15 * 15;
        private const int minDistance = 1;

        //Đường dẫn image
        private string imgPath;

        //Danh sách các điểm bắn
        private List<Shoot> shootResult;

        public TargetView()
        {
            InitializeComponent();
            //this.BorderStyle = new BorderStyle();
            shootResult = new List<Shoot>();
        }

        private void BiaSo4()
        {
            //==============================================================
            //CHỌN BIA SỐ 4
            //Kích thước Bia tính theo centimet
            imgPath = @"Target\Target4.jpg";
            objTarget = new Target(imgPath);
            objTarget.Height = 50; //centimet
            objTarget.Width = 40; //centimet

            objTarget.ScoreCircles.R = 4; //centimet
            objTarget.ScoreCircles.Level = 5; //số vòng tròn tính điểm

            //Gốc tọa độ vẽ
            objTarget.X = 0;
            objTarget.Y = 0;
            //Gốc tọa độ vẽ
            objTarget.ScoreCircles.X = objTarget.X;
            objTarget.ScoreCircles.Y = objTarget.Y;
        }

        
        private void BiaSo8()
        {
            //==============================================================
            //CHỌN BIA SỐ 8
            //Kích thước Bia tính theo centimet
            imgPath = @"Target\Target4.jpg";
            objTarget = new Target(imgPath);
            objTarget.Height = 80; //centimet
            objTarget.Width = 40; //centimet

            objTarget.ScoreCircles.R = 4; //centimet
            objTarget.ScoreCircles.Level = 8; //số vòng tròn tính điểm

            //Gốc tọa độ vẽ
            objTarget.X = 0;
            objTarget.Y = 0;
            //Gốc tọa độ vẽ
            objTarget.ScoreCircles.X = objTarget.X;
            objTarget.ScoreCircles.Y = objTarget.Y + 20;
        }

        /// <summary>
        /// Chọn bia bắn (Ví dụ: chọn bia số 4)
        /// </summary>
        public void SelectTarget(int indexTarget)
        {
            if (indexTarget == 0)
                BiaSo4();
            else
                BiaSo8();
            shootResult = new List<Shoot>();
            this.Refresh();
        }

        
        protected override void OnPaint(PaintEventArgs e)
        {
            if (objTarget == null)
                return;

            Graphics dc = e.Graphics;
            //==============================================================
            //BẮT ĐẦU TÍNH TỌA ĐỘ VẼ
            //Khởi tạo phép ánh xạ (Lấy tỉ lệ cm/pixel)
            objProjection = new Projection(RATE_TARGET_VIEW * Math.Max((float)objTarget.Width / this.Width, (float)objTarget.Height / this.Height), this.Size);

            //Vẽ bia bắn
            objTarget.Draw(dc, objProjection);

            //Vẽ vòng tròn tính điểm
            objTarget.ScoreCircles.Draw(dc, objProjection);

            //Vẽ trục tọa độ
            objProjection.DrawAxis(dc);

            //Vẽ đường di chuyển lúc đang ngắm bắn
            if (newPolygon != null)
                newPolygon.Draw(dc);

            //Vẽ kết quả bắn và hiển thị điểm
            if (shootResult != null)
            {
                Pen pen = new Pen(Color.Orange);
                foreach (Shoot objShoot in shootResult)
                {
                    objShoot.Draw(dc, objProjection);
                    //Point p = objProjection.FromCentiToPixel(pCenti);
                    //Rectangle rect = new Rectangle(p.X - 5, p.Y - 5, 10, 10);
                    //dc.FillRectangle(Brushes.Orange, rect);
                }
                pen.Dispose();  
            }

            //Vẽ vòng tròn active
            //objTarget.ScoreCircles.DrawActive(dc, objProjection);

            base.OnPaint(e);
        }

        private List<Point> pointList = new List<Point>();
        private void TargetView_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;

            if (newPolygon == null)
                return;                 // precaution

            Point point = new Point(e.X, e.Y);
            int distance = (e.X - newPolygon.LastX) * (e.X - newPolygon.LastX) + (e.Y - newPolygon.LastY) * (e.Y - newPolygon.LastY);

            if (distance < minDistance)
            {
                // Distance between last two points is less than minimum -
                // move last point
                newPolygon.MoveHandleTo(point, newPolygon.HandleCount);
            }
            else
            {
                Graphics g = this.CreateGraphics();
                

                //Hiển thị vòng tròn tính điểm
                PointF p = objProjection.FromPixelToCentimet(e.Location);
                //Vẽ vòng tròn active
                objTarget.ScoreCircles.DrawActive(g, objProjection);
                //Tính điểm và vòng tròn active
                int score = objTarget.ScoreCircles.GetScore(p);

                //Nối 2 điểm gần nhất
                newPolygon.DrawLine(g, e.Location);

                // Add new point
                newPolygon.AddPoint(point);
                newPolygon.LastX = e.X;
                newPolygon.LastY = e.Y;
                

                g.Dispose();
            }
        }

        private void TargetView_MouseDown(object sender, MouseEventArgs e)
        {
            //if (e.Button == System.Windows.Forms.MouseButtons.Left)
            //{
                // Create new polygon, add it to the list
                // and keep reference to it
                if (newPolygon == null)
                {
                    newPolygon = new DrawPolygon(e.X, e.Y, e.X + 1, e.Y + 1);
                    newPolygon.LastX = e.X;
                    newPolygon.LastY = e.Y;
                }
            //}
        }

        private void TargetView_MouseUp(object sender, MouseEventArgs e)
        {
            PointF p = objProjection.FromPixelToCentimet(e.Location);
            if (shootResult == null)
                shootResult = new List<Shoot>();

            Shoot objShoot = new Shoot();
            objShoot.Pos = p;
            //Kiểm tra xem điểm bắn có nằm trong target không
            //if (objTarget.InTarget(e.Location))
            if (objTarget.InTarget(p))
            {
                //Tính điểm bắn
                objShoot.Score = objTarget.ScoreCircles.GetScore(p);
            }
            else
                objShoot.Score = 0;
         
            //Lưu điểm bắn lại
            shootResult.Add(objShoot);

            newPolygon = null;

            //Reset activeLevel
            objTarget.ScoreCircles.ActiveLevel = -1;

            //Vẽ điểm bắn cuối cùng
            objShoot.Draw(this.CreateGraphics(), objProjection);
        }
    }
}
